home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 173_01 / lex.mem < prev    next >
Text File  |  1980-01-01  |  68KB  |  1,698 lines

  1. /*
  2.   HEADER: CUG    nnn.nn;
  3.   TITLE:         LEX - A Lexical Analyser Generator
  4.   VERSION:       1.0 for IBM-PC
  5.   DATE:          Sep 29, 195
  6.   DESCRIPTION:   A Lexical Analyser Generator. From UNIX
  7.   KEYWORDS:      Lexical Analyser Generator YACC C PREP
  8.   SYSTEM:        IBM-PC and Compatiables
  9.   FILENAME:      LEX.MEM
  10.   WARNINGS:      This program is not for the casual user. It will
  11.                  be useful primarily to expert developers.
  12.   CRC:           N/A
  13.   SEE-ALSO:      YACC and PREP
  14.   AUTHORS:       Scott Guthery 11100 leadfwood lane Austin, TX 78750
  15.   COMPILERS:     DESMET-C
  16.   REFERENCES:    UNIX Systems Manuals
  17. */
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.          
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.                             DECUS C LANGUAGE SYSTEM
  112.  
  113.  
  114.                                       LEX
  115.                           A lexical Analyser Generator
  116.  
  117.  
  118.                                        by
  119.  
  120.                                Charles H. Forsyth
  121.  
  122.                             University of Waterloo
  123.                             Waterloo, Ontario, N2L 3G1
  124.                             Canada
  125.  
  126.  
  127.                                    Revised by
  128.  
  129.                          Robert B. Denny & Martin Minow
  130.  
  131.  
  132.         LEX  transforms  a  regular-expression  grammar  and  associated
  133.         action  routines into a C function and set of tables, yielding a
  134.         table-driven lexical analyser which manages to  be  compact  and
  135.         rapid.
  136.  
  137.  
  138.                          DECUS Structured Languages SIG
  139.  
  140.                               Version of 30-Oct-82
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.            
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.                      Copyright (C) 1978, Charles H. Forsyth
  160.  
  161.  
  162.  
  163.  
  164.  
  165.                  Modifications Copyright (C) 1980, 1982, DECUS
  166.  
  167.             General permission  to  copy  or  modify,  but  not  for
  168.             profit,  is  hereby  granted,  provided  that  the above
  169.             copyright notice is included and reference made  to  the
  170.             fact that reproduction privileges were granted by DECUS.
  171.  
  172.             The information in this document is  subject  to  change
  173.             without   notice  and  should  not  be  construed  as  a
  174.             commitment by Digital Equipment Corporation or by DECUS.
  175.  
  176.             Neither Digital Equipment Corporation,  DECUS,  nor  the
  177.             authors   assume  any  responsibility  for  the  use  or
  178.             reliability of this document or the described software.
  179.  
  180.             This software is  made  available  without  any  support
  181.             whatsoever.     The    person    responsible    for   an
  182.             implementation of this system should expect to  have  to
  183.             understand  and  modify  the source code if any problems
  184.             are  encountered  in  implementing  or  maintaining  the
  185.             compiler or its run-time library.  The DECUS 'Structured
  186.             Languages Special Interest Group' is the  primary  focus
  187.             for communication among users of this software.
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.         UNIX is  a  trademark  of  Bell  Telephone  Laboratories.   RSX,
  198.         RSTS/E,  RT-11  and  VMS  are  trademarks  of  Digital Equipment
  199.         Corporation.
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.         A Lexical Analyser Generator                              
  217.  
  218.  
  219.         1.0  Introduction
  220.  
  221.         A computer program often has an input stream which  is  composed
  222.         of  small elements, such as a stream of characters, and which it
  223.         would like to convert to larger elements in order to process the
  224.         data  conveniently.   A  compiler  is a common example of such a
  225.         program:  it reads a stream of characters forming a program, and
  226.         would  like  to turn this sequence of characters into a sequence
  227.         of larger items, namely identifiers, numbers, and operators, for
  228.         parsing.   In  a  compiler,  the  procedures  which  do this are
  229.         collectively called the  lexical  analyser,  or  scanner;   this
  230.         terminology will be used more generally here.
  231.  
  232.         It may happen that the speed with which this  transformation  is
  233.         done  will  noticeably affect the speed at which the rest of the
  234.         program operates.  It is certainly true that although such  code
  235.         is  rarely  difficult to write, writing and debugging it is both
  236.         tedious, and time-consuming,  and  one  typically  would  rather
  237.         spend  the  time  on  the hard parts of the program.  It is also
  238.         true that while certain transformations are easily  thought  of,
  239.         they   are  often  hard  to  express  succinctly  in  the  usual
  240.         general-purpose programming languages (eg, the description of  a
  241.         floating-point number).
  242.  
  243.         LEX is a program which tries to give a programmer a good deal of
  244.         help  in  this,  by  writing large parts of the lexical analyser
  245.         automatically, based on a description supplied by the programmer
  246.         of  the  items  to be recognised (which are known as tokens), as
  247.         patterns of the more basic elements of the  input  stream.   The
  248.         LEX  description  is  very  much  a special-purpose language for
  249.         writing lexical analysers, and LEX is then simply  a  translator
  250.         for  this  language.  The LEX language is easy to write, and the
  251.         resulting processor is compact and fast running.
  252.  
  253.         The purpose of a LEX program is to read an input stream, and
  254.         recognise tokens.  As the lexical analyser will usually exist as
  255.         a subroutine in a larger set  of  programs, it will return a "token
  256.         number", which indicates which token was found, and possibly
  257.         a "token  value", which provides more detailed information about
  258.         possibility; a LEX program is often a good description of the
  259.         structure of the whole computation, and in such a case,  the
  260.         lexical  analyser might choose to call other routines to perform
  261.         the necessary actions whenever a particular token is recognised,
  262.         without reference to its own caller.
  263.  
  264.         2.0  The Lex Language
  265.  
  266.         LEX transforms a regular-expression grammar into a deterministic
  267.         finite-state  automaton that recognizes that grammar.  Each rule
  268.         of the grammar is associated with  an  action  which  is  to  be
  269.         performed  when  that rule successfully matches some part of the
  270.         input data.
  271.  
  272.         Because of the nature of regular  expression  grammars,  certain
  273.         language  constructions  cannot  be  recognized by LEX programs.
  274.         Specifically, expressions with balanced  parentheses  cannot  be
  275.         recognized.  This means that LEX cannot be used to recognize all
  276.         Fortran keywords as some  (DO,  IF,  and  FORMAT,  for  example)
  277.         require  elaborate  recognition to distinguish between ambiguous
  278.         constructions.
  279.  
  280.  
  281.  
  282.         2.1  Elementary Things
  283.  
  284.         Strings,  characters,  sets  of  characters   called   character
  285.         classes,  and  operators  to  form  these into patterns, are the
  286.         fundamental elements of the LEX language.
  287.  
  288.         A string is a sequence of  characters,  not  including  newline,
  289.         enclosed  in  quotes,  or  apostrophes.   Within  a  string, the
  290.         following escape sequences
  291.         (which are those of the C language) allow any 8-bit character to
  292.         be  represented,  including  the  escape  character, quotes, and
  293.         newlines:
  294.  
  295.                 \n      NL      (012)
  296.                 \r      CR      (015)
  297.                 \b      BS      (010)
  298.                 \t      TAB     (011)
  299.                 \"      "
  300.                 \'      '
  301.                 \c      c
  302.                 \\      \
  303.                 \NNN    (NNN)
  304.  
  305.         where NNN  is  a  number  in  octal,  and  c  is  any  printable
  306.         character.   A  string may be continued across a line by writing
  307.         the escape character before the newline.
  308.  
  309.         Outside a string, a sequence of upper-case letters stands for  a
  310.         sequence  of the equivalent lower-case letters, while a sequence
  311.         of lower-case letters is taken as the name of a LEX  expression,
  312.         and  handled  specially,  as described below.  These conventions
  313.         make the  use  of  named  expressions  and  the  description  of
  314.         lower-case  keywords (the usual case on Unix) fairly convenient.
  315.         Keywords in case-independent languages, such as Fortran, require
  316.         additional effort to match, as will be noted.
  317.  
  318.         An Ascii character other than one of
  319.  
  320.                 () {} [ * | = ; % / \ ' " -
  321.  
  322.         may be used in LEX to stand for itself.
  323.  
  324.         A sequence of characters enclosed  by  brackets  ('['  and  ']')
  325.         forms  a  character class, which stands for all those characters
  326.         within the brackets.  If a circumflex ('^') follows the  opening
  327.         bracket,  then  the  class  will  instead  stand  for  all those
  328.         characters but those inside the brackets.  The escapes  used  in
  329.         strings may be used in character classes as well.
  330.  
  331.         Within a character class, the construction "A-B" (where "A"  and
  332.         "B" are arbitrary characters) stands for the range of characters
  333.         between "A" and "B" inclusive.
  334.  
  335.         For example,
  336.  
  337.                 "ABC"           matches "abc"
  338.  
  339.                 "[ABC]"         matches "A" or "B" or "C"
  340.  
  341.                 "[A-Za-z0-9]"   matches all letters and digits
  342.  
  343.         Case-independent keyword recognition may be described  by  using
  344.         auxiliary  definitions  to  define expressions that match either
  345.         case.  For example,
  346.  
  347.                 a = [Aa];
  348.                 b = [Bb];
  349.                 ...
  350.                 z = [Zz];
  351.                 %%
  352.                 d o             Matches "DO", "do", "Do", or "dO"
  353.  
  354.         2.2  Putting Things Together
  355.  
  356.         Several operators are provided to allow construction of  a  type
  357.         of pattern called a regular expression.  Such expressions can be
  358.         implemented as finite-state automata (without memory or stacks).
  359.         A  reference  to  an  "occurrence"  of  a  regular expression is
  360.         generally taken to mean an occurrence of any string  matched  by
  361.         that  regular  expression.  The operators are presented in order
  362.         of decreasing priority.  In all cases, operators work on  either
  363.         strings or character classes, or on other regular expressions.
  364.  
  365.         Any string or character class forms a regular  expression  which
  366.         matches  whatever  the  string or character class stands for (as
  367.         described above).
  368.  
  369.         The operator '*' applied following a regular expression forms  a
  370.         new  regular  expression  which matches an arbitrary number (ie,
  371.         zero or more) of  adjacent  occurrences  of  the  first  regular
  372.         expression.   The  operation  is  often  referred to as (Kleene)
  373.         closure.
  374.  
  375.         The operation of concatenation of  two  regular  expressions  is
  376.         expressed  simply by writing the regular expressions adjacent to
  377.         each  other.   The  resulting  regular  expression  matches  any
  378.         occurrence  of the first regular expression followed directly by
  379.         an occurrence of the second regular expression.
  380.  
  381.         The operator  '|',  alternation,  written  between  two  regular
  382.         expressions   forms   a  regular  expression  which  matches  an
  383.         occurrence of the first regular expression or an  occurrence  of
  384.         the second regular expression.
  385.  
  386.         Any regular expression may be enclosed in parentheses  to  cause
  387.         the priority of operators to be overridden in the usual manner.
  388.  
  389.         A few examples should help to make all of this clear:
  390.  
  391.                 "[0-9]*"        matches a (possibly empty)  sequence  of
  392.                                 digits.
  393.  
  394.                 "[A-Za-z_$][A-Za-z0-9_$]*"
  395.                                 matches a C identifier.
  396.  
  397.                 "([A-Za-z_$]|[0-9])*"
  398.                                 matches a C identifier, or a sequence of
  399.                                 digits,  or  a  sequence  of letters and
  400.                                 digits intermixed, or nothing.
  401.  
  402.  
  403.  
  404.         2.3  The General Form of Lex Programs
  405.  
  406.         A LEX source input file consists of three sections:   a  section
  407.         containing   auxiliary   definitions,   a   section   containing
  408.         translations, and a section containing programs.
  409.  
  410.         Throughout a LEX program, spaces, tabs, and newlines may be used
  411.         freely, and PL/1-style comments:
  412.  
  413.                 /* ... anything but '*/' ... */
  414.  
  415.         may be used, and are treated as a space.
  416.  
  417.         The auxiliary definition section must be present, separated from
  418.         following  sections  by the two-character sequence '%%', but may
  419.         be empty.  This  section  allows  definition  of  named  regular
  420.         expressions,  which  provide  the useful ability to use names of
  421.         regular expressions in the  translation  section,  in  place  of
  422.         common sub-expressions, or to make that section more readable.
  423.  
  424.         The translation section follows the '%%' sequence, and  contains
  425.         regular  expressions paired with actions which describe what the
  426.         lexical analyser should do when it discovers an occurrence of  a
  427.         given regular expression in its input stream.
  428.  
  429.         The program section may be omitted;  if it is present it must be
  430.         separated from the translation section by the '%%' sequence.  If
  431.         present, it may contain anything in general,  as  it  is  simply
  432.         tacked on to the end of the LEX output file.
  433.  
  434.         The style of this layout will be familiar to users of Yacc.   As
  435.         LEX  is  often used with that processor, it seemed reasonable to
  436.         keep to a similar format.
  437.  
  438.  
  439.  
  440.         2.4  Auxiliary Definitions
  441.  
  442.         Given the set of regular expressions forming a complete  syntax,
  443.         there  are often common sub-expressions.  LEX allows these to be
  444.         named, defined  but  once,  and  referred  to  by  name  in  any
  445.         subsequent   regular  expression.   Note  that  definition  must
  446.         precede use.  A definition has the form:
  447.  
  448.                 expression_name = regular_expression ;
  449.  
  450.         where a name is composed of a lower-case letter  followed  by  a
  451.         sequence  string  of letters and digits, and where an underscore
  452.         is considered a letter.  For example,
  453.  
  454.                 digit   = [0-9];
  455.                 letter  = [a-zA-Z];
  456.                 name    = letter(letter|digit)*;
  457.  
  458.         The semicolon is needed to resolve some ambiguities in  the  LEX
  459.         syntax.
  460.  
  461.         Three  auxiliary  definitions  have  special  meaning  to   LEX:
  462.         "break",  "illegal",  and  "ignore."  They  are  all  defined as
  463.         character classes ("break = [,.?]", for example) and are used as
  464.         follows:
  465.  
  466.                 break   An input token will always terminate if a member
  467.                         of the "break" class is scanned.
  468.  
  469.                 illegal The "illegal"  class  allows  simplification  of
  470.                         error detection, as will be described in a later
  471.                         section.  If this  class  is  defined,  and  the
  472.                         lexical  analyser  stops  at  a  character  that
  473.                         "cannot"  occur  in  its  present  context,  the
  474.                         analyser  will  output  a suitable error message
  475.                         and ignore the offender.
  476.  
  477.                 ignore  This class defines a set of characters that  are
  478.                         ignored by the analyser's input routine.
  479.  
  480.  
  481.  
  482.  
  483.         2.5  Translations
  484.  
  485.         One would like to provide a description  of  the  action  to  be
  486.         taken  when  a  particular sequence of input characters has been
  487.         matched by a given regular expression.  The kind of action taken
  488.         might  vary  considerably, depending upon the application.  In a
  489.         compiler, typical actions are:  enter an identifer into a symbol
  490.         table,  read and store a string, or return a particular token to
  491.         the parser.  In text processing, one  might  wish  to  reproduce
  492.         most  of  the input stream on an output stream unchanged, making
  493.         substitutions when a particular sequence of characters is found.
  494.         In  general,  it  is  hard to predict what form the action might
  495.         take, and so, in LEX the nature of the action  is  left  to  the
  496.         user,  by allowing specification, for each regular expression of
  497.         interest, C-language code to be executed when a string  matching
  498.         that  expression  is  discovered  by  the driving program of the
  499.         lexical  analyser.   An  action,  together  with   its   regular
  500.         expression, is called a translation, and has the format:
  501.  
  502.                 regular_expression { action }
  503.  
  504.         All of this may be spread across several lines.  The action  may
  505.         be empty, but the braces must appear.
  506.  
  507.         Earlier, it was argued that most general-purpose  languages  are
  508.         inappropriate for writing lexical analysers, and it is important
  509.         to see that the subsequent use of such a language  to  form  the
  510.         actions  is not a contradiction.  Most languages are fairly good
  511.         at  expressing  the  actions  described  above   (symbol   table
  512.         manipulation,  writing  character  strings,  and such).  Leaving
  513.         this part of the lexical analyser to those  languages  therefore
  514.         not  only  makes  sense,  but also ensures that decisions by the
  515.         writer of the lexical analyser generator will not  unduly  cramp
  516.         the  user's style.  However, general-purpose languages do not as
  517.         a rule provide inexpensive pattern matching facilities, or input
  518.         description formats, appropriate for describing or structuring a
  519.         lexical analyser.
  520.  
  521.         Allowing a user to provide his own code is not really enough, as
  522.         he  will  need  some  help  from  LEX  to obtain a copy of, or a
  523.         pointer to, the current token, if nothing else.  LEX provides  a
  524.         library  of C functions which may be called to obtain controlled
  525.         access to some of  the  data  structures  used  by  the  driving
  526.         programs  of  the  lexical  analyser.   These are described in a
  527.         later section.
  528.  
  529.         2.5.1  Numbers and Values -
  530.  
  531.         Typically, a lexical analyser will return a value to its  caller
  532.         indicating  which  token has been found.  Within an action, this
  533.         is done by writing a  C  return  statement,  which  returns  the
  534.         appropriate value:
  535.  
  536.                 BEGIN   {
  537.                                 return(T_BEGIN);
  538.                         }
  539.                 name    {
  540.                                 lookup(token(NULL));
  541.                                 return(T_NAME);
  542.                         }
  543.                 "/"     {
  544.                                 return('/');
  545.                         }
  546.  
  547.         Note that function lookup() is provided by the user program.
  548.  
  549.         In many cases, other information must be supplied to its  caller
  550.         by  the scanner.  When an identifier is recognised, for example,
  551.         both a pointer to a symbol-table entry,  and  the  token  number
  552.         T_NAME  must  be returned, yet the C return statement can return
  553.         but a single value.  Yacc has a  similar  problem,  and  so  its
  554.         lexical  analyser  sets  an  external word 'yylval' to the token
  555.         value, while the token number is returned by the  scanner.   LEX
  556.         uses  the external 'yylval' (to be compatible), but, to make LEX
  557.         programs more readable when used alone, the name 'lexval' is set
  558.         by a #define statement to 'yylval'.  For example,
  559.  
  560.                 name    {
  561.                                 lexval = lookup(token(NULL));
  562.                                 return(T_NAME);
  563.                         }
  564.  
  565.  
  566.         Certain  token  numbers  are  treated  specially;    these   are
  567.         automatically defined as manifests (see section 3.2) by LEX, and
  568.         all begin with the sequence 'LEX...' so as not to clash with the
  569.         user's own names.  There are two such tokens defined at present:
  570.  
  571.                 LEXSKIP When  returned  by  a  user's  action   routine,
  572.                         LEXSKIP  causes  the  lexical analyser to ignore
  573.                         the current token (ie, it does  not  inform  the
  574.                         parser of its presence), and to look instead for
  575.                         a new token.  This may be used  when  a  comment
  576.                         sequence has been discovered, and discarded.  It
  577.                         is also useful when the action routine completes
  578.                         processing  of the token.  See the discussion of
  579.                         the comment() library function for an example of
  580.                         its usage.
  581.  
  582.                 LEXERR  This  is  returned  by  the   lexical   analyser
  583.                         (function  yylex()) when an unrecognizable input
  584.                         sequence has been detected.  By default,  LEXERR
  585.                         is 256.  This the same as the yacc error value.
  586.  
  587.  
  588.         To summarise, the token number is  set  by  the  action  with  a
  589.         return   statement,   and   the   token   value  (ie,  auxiliary
  590.         information) is set by assigning  this  value  to  the  external
  591.         integer 'lexval'.
  592.  
  593.  
  594.  
  595.         2.6  Declaration Sections
  596.  
  597.         Declarations in the language of the actions may be  included  in
  598.         both  the  auxiliary  definition  section and in the translation
  599.         section.   In  the  former  case,  these  declarations  will  be
  600.         external  to  the lexical analyser, and in the latter case, they
  601.         will be local to the lexical analyser (ie, static, or  automatic
  602.         storage).    Declaration  sections  consist  of  a  sequence  of
  603.         declarations surrounded by the special bracketing sequences '%{'
  604.         and '%}' (as in Yacc).  The characters within these brackets are
  605.         copied unchanged into  the  appropriate  spots  in  the  lexical
  606.         analyser  program  that  LEX writes.  The examples in appendix A
  607.         suggest how these might be used.
  608.  
  609.  
  610.  
  611.         3.0  Using Lex from C
  612.  
  613.         The present version of LEX is intended for use with C;   and  it
  614.         is this usage which will be described here.
  615.  
  616.  
  617.  
  618.         3.1  The Function yylex()
  619.  
  620.         The structure  of  LEX  programs  is  influenced  by  what  Yacc
  621.         requires of its lexical analyser.
  622.  
  623.         To begin with, the lexical analyser must be named  'yylex',  has
  624.         no  parameters,  and is expected to return a token number, where
  625.         that number is determined by Yacc.   The  token  number  for  an
  626.         Ascii  character  is  its  Ascii  value  (ie,  its  value as a C
  627.         character constant).  Named tokens,  defined  in  yacc  '%token'
  628.         statements,  have a number above 256, with the particular number
  629.         accessible through a Yacc-produced #define of  the  given  token
  630.         name as its number.  Yacc also allows 'yylex' to pass a value to
  631.         the Yacc  action  routines,  by  assigning  that  value  to  the
  632.         external 'yylval'.
  633.  
  634.         LEX thus provides a lexical  analyser  function  named  'yylex',
  635.         which interprets tables constructed by the LEX program returning
  636.  
  637.         the token number returned by the actions  it  performs.   Values
  638.         assigned  to  lexval are available in 'yylval', so that use with
  639.         Yacc is straightforward.
  640.  
  641.         A value of zero is returned by 'yylex' at  end-of-file,  and  in
  642.         the absence of a return statement in an action, a non-zero value
  643.         is returned.   If  computation  is  performed  entirely  by  the
  644.         lexical analyser, then a suitable main program would be
  645.  
  646.                 main()
  647.                    {
  648.                    while (yylex()) ;
  649.                    }
  650.  
  651.  
  652.  
  653.  
  654.         3.2  Serial Re-Use of yylex()
  655.  
  656.         The  yylex()  function  contains  several  variables  which  are
  657.         statically  initialized  at  compile time.  Once yylex() sees an
  658.         EOF (-1) input character, it will continue to return  NULL.   If
  659.         yylex()  is  to  be  used inside a loop which processes multiple
  660.         files, it must be re-initialized at the beginning  of  each  new
  661.         file  with  a  call  to  the  LEX library routine llinit().  For
  662.         example (slightly extending the previous example):
  663.  
  664.                 main()
  665.                    {
  666.                    getfilelist();
  667.                    for(file = first; file != last; file = next)
  668.                       {
  669.                       llinit();
  670.                       while (yylex());
  671.                       }
  672.                    printf("All files done\n");
  673.                    }
  674.  
  675.         The call to llinit() is unnecessary if  yylex()  is  to  process
  676.         only one file, or is kept from seeing an EOF input character.
  677.  
  678.  
  679.  
  680.         3.3  The Lex Table File
  681.  
  682.         In the absence of instructions to the contrary (see below),  LEX
  683.         reads a given LEX language file, (from the standard input, if an
  684.         input file has not been specified) and produces a C program file
  685.         'lextab.c'  which  largely  consists  of  tables  which are then
  686.         interpreted by 'yylex()' (which is in  the  LEX  library).   The
  687.         actions  supplied  by  the user in each translation are combined
  688.         with a switch statement into a single function, which is  called
  689.         by  the table interpreter when a particular token is found.  The
  690.  
  691.         contents of the program section of the LEX file are added at the
  692.         end  of  the  output  file (lextab.c by default).  Normally, LEX
  693.         also inserts the lines
  694.  
  695.                 #include <stdio.h>
  696.                 #include <lex.h>
  697.  
  698.         at the top of the file;  this causes  declarations  required  by
  699.         the  standard  I/O  library and by LEX to be included when the C
  700.         program is compiled.
  701.  
  702.  
  703.  
  704.         3.4  Analyzers Which Don't Use "Standard I/O"
  705.  
  706.         With  the  current  release,  LEX  supports  the  generation  of
  707.         analyzers  which  may be incorporated into programs which do not
  708.         use the "standard I/O" library.  By setting the "-s" switch,  as
  709.         shown  below, the generation of the "#include <stdio.h>" line is
  710.         supressed.  All references to standard I/O  specific  files  and
  711.         stdio.h  have  been removed from the LEX library (described in a
  712.         later section), with the  exception  of  lexgetc(),  lexerror(),
  713.         mapch() and lexecho(), which are standard I/O dependent.
  714.  
  715.         The declaration of yylex()'s input file iov pointer "lexin"  now
  716.         resides  in LEXGET.C (lexgetc()).  The code which defaults lexin
  717.         to stdin has been moved from yylex() to the table file.  yylex()
  718.         now  calls  the  routine  llstin(),  which is generated into the
  719.         table file.  There are no longer any hardwired references to the
  720.         variable   "lextab",  the  default  table  name.   Instead,  LEX
  721.         generates a call to lexswitch() in llstin(),  which  initializes
  722.         yylex()  to use the table whose name was given in a "-t" or "-e"
  723.         option in LEX's command line.  If neither was given, the default
  724.         name  "lextab" is used.  Once the initial table has been set up,
  725.         further automatic calls to lexswitch() are  supressed,  allowing
  726.         the user to manually switch tables as before.
  727.  
  728.         In addition, If the "-s" switch is not given (i.e.,  normal  use
  729.         with  standard  I/O), llstin() defaults lexin to stdin.  If "-s"
  730.         is given, llstin() is generated to do the lexswitch()  mentioned
  731.         above  only.  In any case, yylex() contains no references to the
  732.         standard I/O system.
  733.  
  734.         What all of this means is that under normal operation, you won't
  735.         notice  any  change  in LEX's characteristics.  In addition, you
  736.         may use the "-e" ("easy") switch, which will generate a C output
  737.         file  and  LEX tables which (conveniently) have the same name as
  738.         the input file, and everything will get  set  up  automagically.
  739.         If  you  specify the "-s" switch, the table file will contain no
  740.         references to the standard I/O package, and you may use  any  of
  741.         the  lexlib  routines  except  lexgetc(), lexerror(), mapch() or
  742.         lexecho().
  743.  
  744.         Don't forget that you  must  supply  your  own  startup  routine
  745.         "$$main"  if  you  do not want the standard I/O library.  With a
  746.         bit of care in this regard, it will be  possible  to  link  your
  747.         program  with the C library without dragging in any I/O modules.
  748.         This prevents your having to build another library in  order  to
  749.         access  non-I/O  library  functions.  Just make the reference to
  750.         the C library the last one given to the linker or taskbuilder so
  751.         that  only  those routines which have not already been found are
  752.         pulled from CLIB.
  753.  
  754.  
  755.                                       NOTE
  756.  
  757.             Programs that use LEX-generated analyzers and do not use
  758.             the standard I/O package must supply their own lexgetc()
  759.             and lexerror() routines.  Failure to do so  will  result
  760.             in undefined globals.
  761.  
  762.  
  763.  
  764.  
  765.  
  766.         3.5  Operating LEX
  767.  
  768.         LEX normally reads the grammar from the standard input,  writing
  769.         the  C  program  to  the  file  'lextab.c'.   It  may be further
  770.         controlled by using the following flags upon invocation:
  771.  
  772.                 -i filename     The grammar is read from 'filename'.
  773.  
  774.                 -o filename     The analyser is written to 'filename'.
  775.  
  776.                 -t tablename    The default  finite-state  automaton  is
  777.                                 named  lextab  (and  it  is, by default,
  778.                                 written to  file  'lextab.c').   The  -t
  779.                                 switch  causes the internal tables to be
  780.                                 named 'tablename' and, if the -o  switch
  781.                                 is    not   given,   written   to   file
  782.                                 'tablename.c'.  This is necessary if the
  783.                                 processor-switching         capabilities
  784.                                 described in a later section are  to  be
  785.                                 used.
  786.  
  787.                 -e name         "Easy"  command  line.    "-e name"   is
  788.                                 equivalent to typing
  789.  
  790.                                    -i name.LXI -o name.C -t name
  791.  
  792.                                 Do not  include  device  names  or  file
  793.                                 extensions on the "easy" command line.
  794.  
  795.                 -v [filename]   Internal state information is written to
  796.                                 'filename.'   If   not   present,  state
  797.                                 information   is   written    to    file
  798.                                 'lex.out.'
  799.  
  800.                 -d              Enable various debugging printouts.
  801.  
  802.                 -s              Generate analyzer without references  to
  803.                                 standard I/O
  804.  
  805.  
  806.         The command line  for  compilation  of  the  table  file  should
  807.         contain no surprises:
  808.  
  809.                 cc -c -O lextab.c       (on Unix)
  810.  
  811.                 xcc lextab -a           (on Dec operating systems)
  812.  
  813.         but when one is producing  the  running  program,  one  must  be
  814.         careful to include the necessary libraries.  On Unix, the proper
  815.         sequence is:
  816.  
  817.                 cc userprog.o lextab.o -ll -lS
  818.  
  819.         The '-ll'  causes  the  LEX  library  (described  below)  to  be
  820.         searched,  and  the  '-lS' causes the Standard I/O library to be
  821.         used;  both libraries are required.  If Yacc is  used  as  well,
  822.         the  library  '-ly'  should  be  included before the '-ll'.  The
  823.         actual order and content of the rest  of  the  command  line  is
  824.         determined by the user's own requirements.
  825.  
  826.         If using the Decus C compiler, the lexical analyser built by LEX
  827.         is linked with c:lexlib.
  828.  
  829.         The complete process (assuming the  Decus  compiler  running  on
  830.         RSTS/E in RT11 mode) is thus:
  831.  
  832.                 mcr lex -i grammar.lxi -o grammar.c     ! Build analyser
  833.                 cc grammar                              ! Compile the
  834.                 as grammar                              ! grammar table
  835.                 link out=in,grammar,c:lexlib,c:suport,c:clib/b:2000
  836.  
  837.  
  838.  
  839.  
  840.         4.0  The Lex Library
  841.  
  842.         All programs using grammars generated  by  LEX  must  be  linked
  843.         together  with  the LEX library.  On Unix, this is '/lib/libl.a'
  844.         (or '-ll' on the cc command line) and on DEC operating  systems,
  845.         C:LEXLIB  (LB:[1,1]LEX.OLB for RSX).  It contains routines which
  846.         are either essential or merely useful  to  users  of  LEX.   The
  847.         essential  routines  include  a  routine to obtain a copy of the
  848.         current token, and a routine to switch to  a  different  set  of
  849.         scanning  tables.  Routines of the second, useful, class perform
  850.         functions which might well be written by the user  himself,  but
  851.         are  there  to  save  him  the  bother;   including a routine to
  852.         process various forms of comments and  a  routine  to  transform
  853.         numbers  written  in arbitrary bases.  Both sets of routines are
  854.         expected to grow as LEX sees use.
  855.  
  856.         Those functions which  produce  diagnostics  do  so  by  calling
  857.         lexerror(), which is called as
  858.  
  859.                 lexerror(string, arg1, ..., argN)
  860.  
  861.         and is expected to write its arguments (likely using the "remote
  862.         format"  facility  of  the  fprintf()  function),  followed by a
  863.         newline, on  some  output  stream.   A  Lexerror()  function  is
  864.         included  in  the LEX library, but a user is free to include his
  865.         own.  The routine in the LEX library is standard I/O specific.
  866.  
  867.  
  868.                                       NOTE
  869.  
  870.             The VAX/VMS native C library  does  not  support  remote
  871.             formats.   The  Lexerror  function  in  the  LEX library
  872.             conditionally compiles to support a call  to  lexerror()
  873.             with  only  an error message string.  Remote formats are
  874.             supported under Decus C.  Learn to use  them,  they  are
  875.             very nice!
  876.  
  877.  
  878.  
  879.  
  880.  
  881.         4.0.1  Comment -- skip over a comment -
  882.  
  883.                 comment(delim)
  884.                 char delim[];
  885.  
  886.         Comment() may be called by a translation when  the  sequence  of
  887.         characters which mark the start of a comment in the given syntax
  888.         has been recognised by LEX.  It takes a string which  gives  the
  889.         sequence  of  characters  which  mark  the end of a comment, and
  890.         skips over characters in the input stream until this sequence is
  891.         found.   Newlines  found  while  skipping  characters  cause the
  892.         external 'yyline' to be incremented;  an unexpected  end-of-file
  893.         produces  a  suitable diagnostic.  Thus, 'comment("*/")' matches
  894.         C-style comments, and 'comment("\n")' matches as-style comments.
  895.         There  are  other  methods  of  handling  comments  in LEX;  the
  896.         comment() function is usually the best with regard to both space
  897.         and time.
  898.  
  899.  
  900.  
  901.         4.0.2  Gettoken -- obtain a copy of token -
  902.  
  903.                 gettoken(buf, sizeof(buf))
  904.                 char buf[];
  905.  
  906.         Gettoken() takes the address of a character buffer, and its size
  907.         in bytes, and copies the token most recently matched by LEX into
  908.         the buffer.  A null byte is added to mark the end of  the  token
  909.         in  the  buffer, but, as null bytes are legitimate characters to
  910.         LEX, the true length of the token is returned by gettoken().
  911.  
  912.         For example, the following function calls lexlength() to  obtain
  913.         the  length  of a token.  It then calls the storage allocator to
  914.         allocate sufficient storage for the token and copies  the  token
  915.         into the allocated area.
  916.  
  917.                 char *
  918.                 save()
  919.                 /*
  920.                  * Save current token, return a pointer to it
  921.                  */
  922.                 {
  923.                         register char   *tbuffer;
  924.                         register int    len;
  925.                         register char   *tend;
  926.                         extern char     *token();
  927.                         extern char     *copy();
  928.  
  929.                         len = lexlength() + 1;
  930.                         if (tbuffer = malloc(len)) == NULL)
  931.                                 error("No room for token");
  932.                         gettoken(tbuffer, len);
  933.                         return(tbuffer);
  934.                 }
  935.  
  936.  
  937.  
  938.  
  939.         4.0.3  Integ -- long integer, any base -
  940.  
  941.                 long
  942.                 integ(nptr, base)
  943.                 char *nptr;
  944.  
  945.         Integ() converts the Ascii string at 'nptr' into a long integer,
  946.         which  it  returns.   Conversion  stops  at the first non-digit,
  947.         where the digits are  taken  from  the  class  "[0-9a-zA-Z]"  as
  948.         limited by the given 'base'.  Integ() does not understand signs,
  949.         nor are blanks or tabs allowed in the string.
  950.  
  951.  
  952.  
  953.         4.0.4  Lexchar -- steal character --
  954.  
  955.                 lexchar()
  956.  
  957.         Lexchar() returns the next character from the LEX input  stream.
  958.         (This  means  that  LEX  will  no  longer  see  it.)  LEX uses a
  959.         look-ahead buffer to handle complex languages, and this function
  960.         takes this into account.
  961.  
  962.  
  963.         4.0.5  Lexecho -- write token to a file (STDIO ONLY) -
  964.  
  965.                 lexecho(fp);
  966.                 FILE *fp;
  967.  
  968.         Lexecho() may be called by a LEX action  routine  to  write  the
  969.         current token to a specified file.
  970.  
  971.  
  972.                                       NOTE
  973.  
  974.             Programs using analyzers built with  LEX's  "-s"  switch
  975.             must supply their own lexecho() function if needed.
  976.  
  977.  
  978.  
  979.  
  980.  
  981.         4.0.6  Lexgetc -- supply characters to yylex (STDIO ONLY) -
  982.  
  983.                 lexgetc()
  984.  
  985.         Lexgetc() is called by the lexical analyser to obtain characters
  986.         from  its input stream.  The version in the library is dependent
  987.         on the standard I/O package, and is:
  988.  
  989.                 FILE *lexin;    /* Declare iov address locally */
  990.                 lexgetc()
  991.                 {
  992.                         return(getc(lexin));
  993.                 }
  994.  
  995.         If lexin is NULL when yylex() is entered, it will be assigned to
  996.         stdin.   This  is done by yylex() calling the function llstin(),
  997.         which is generated in the table file.  Unless the "-s" switch is
  998.         given  to  LEX,  the llstin() function assigns lexin to stdin if
  999.         lexin is NULL.  If the  "-s"  switch  was  given,  the  llstin()
  1000.         routine  is  a  no-op.   The user may provide his own version of
  1001.         lexgetc() to pre-process the data to the lexical  analyser.   An
  1002.         example of this is shown in the appendix.
  1003.  
  1004.  
  1005.                                       NOTE
  1006.  
  1007.             Programs using analyzers built with  LEX's  "-s"  switch
  1008.             must  supply  their  own lexgetc() function, and "lexin"
  1009.             has no meaning in this context.
  1010.  
  1011.  
  1012.         4.0.7  Lexlength -- return length of a token. -
  1013.  
  1014.                 lexlength();
  1015.  
  1016.         Lexlength() may be called by a LEX action routine to obtain  the
  1017.         length  of  the  current  token in bytes.  An example of this is
  1018.         shown in the description of gettoken().
  1019.  
  1020.  
  1021.  
  1022.         4.0.8  Lexpeek -- examine character -
  1023.  
  1024.                 lexpeek()
  1025.  
  1026.         Lexpeek() performs a function similar to that of Lexchar(),  but
  1027.         does  not  have  the  side-effect of removing the character from
  1028.         LEX's view.
  1029.  
  1030.  
  1031.  
  1032.         4.0.9  Lexswitch -- switch scanning tables -
  1033.  
  1034.                 struct lextab *
  1035.                 lexswitch(newtb)
  1036.                 struct lextab *newtb;
  1037.  
  1038.         Lexswitch() is called to cause LEX to use a  different  scanning
  1039.         table;  it returns a pointer to the one previously in use.  This
  1040.         facility is useful if  certain  objects  of  the  language  (eg,
  1041.         strings  in  C) have a fairly complicated structure of their own
  1042.         which cannot be handled within the translation  section  of  the
  1043.         LEX description of the larger language.
  1044.  
  1045.  
  1046.  
  1047.         4.0.10  Llinit -- Reinitialize yylex() -
  1048.  
  1049.                 llinit()
  1050.  
  1051.         Llinit() is a function which resets the state of yylex() to it's
  1052.         cold-start   condition.   Several  of  yylex()'s  variables  are
  1053.         initialized at compile time, and must be reinitialized if it  is
  1054.         to  be serially re-used.  An example of this is where yylex() is
  1055.         repeatedly called inside a loop which processes  multiple  input
  1056.         files.  Each time a new file is started, llinit() must be called
  1057.         before the first call to yylex() for the new file.
  1058.  
  1059.  
  1060.         4.0.11  Mapch -- Handle C escapes within strings (STDIO ONLY) -
  1061.  
  1062.                 int mapch(delim, esc)
  1063.                 char delim;
  1064.                 char esc;
  1065.  
  1066.         Mapch() is a function which handles C "escape"  characters  such
  1067.         as "\n" and "\nnn".  It will scan off the entire escape sequence
  1068.         and return the equivalent ASCII code as an integer.  It is meant
  1069.         for  use  with  YACC while scanning quoted strings and character
  1070.         constants.
  1071.  
  1072.         If it encounters EOF while  scanning,  it  calls  lexerror()  to
  1073.         print  an  error message warning of "Unterminated string".  If a
  1074.         normal character is  read,  it  returns  the  ASCII  value.   If
  1075.         "delim"  (usually " or ') is read, it returns EOF.  If a newline
  1076.         (ASCII linefeed) is read, it increments the global "yyline"  and
  1077.         calls itself recursively for the next line of input.  It may use
  1078.         the ungetc() function to back up in the input stream.
  1079.  
  1080.  
  1081.                                       NOTE
  1082.  
  1083.             This routine is very application-specific for use by LEX
  1084.             and  YACC  when  they  are working together.  You should
  1085.             read the code in MAPCH.C before using this function.
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.         4.0.12  Token -- get pointer to token -
  1092.  
  1093.                 char *
  1094.                 token(end_pointer)
  1095.                 char **end_pointer;
  1096.  
  1097.         Token() locates the first byte of the current token and  returns
  1098.         its  address.   It  takes  an argument which is either NULL or a
  1099.         pointer to a character pointer;  if the latter, that pointer  is
  1100.         set  to  point  to  the  byte after the last byte of the current
  1101.         token.  Token() is slightly faster,  and  more  convenient  than
  1102.         gettoken()  for  those  cases where the token is only one or two
  1103.         bytes long.
  1104.  
  1105.  
  1106.  
  1107.  
  1108.         5.0  Error Detection and Recovery
  1109.  
  1110.         If a character is detected in the input stream which  cannot  be
  1111.         added  to  the  last-matched  string,  and  which cannot start a
  1112.         string, then that character is considered illegal by  LEX.   LEX
  1113.         may be instructed to return a special 'error' token, or to write
  1114.         a diagnostic with lexerror().  At present,  the  former  is  the
  1115.         default action.
  1116.  
  1117.         The token LEXERR is a special value which is recognised by Yacc,
  1118.         and causes it to start its own error recovery.  It is defined by
  1119.         the header file lex.h for use by other programs.
  1120.  
  1121.         Often, it makes more sense to simply type a suitable diagnostic,
  1122.         and  continue by ignoring the offending character.  It is fairly
  1123.         easy to cause  LEX  to  do  this,  by  including  the  auxiliary
  1124.         definition:
  1125.  
  1126.                 illegal = [\0-\377];
  1127.  
  1128.         which defines a  character  class  "illegal"  which  is  handled
  1129.         specially  by LEX.  If the character that is causing the trouble
  1130.         is a member of that character class (and  in  the  example,  all
  1131.         characters  are),  then  LEX will write a diagnostic, and ignore
  1132.         it;  otherwise, it will return the special token LEXERR
  1133.  
  1134.         More comprehensive  techniques  may  be  added  as  they  become
  1135.         apparent.
  1136.  
  1137.  
  1138.  
  1139.         6.0  Ambiguity and Look-ahead
  1140.  
  1141.         Many computer languages have ambiguous grammars in that an input
  1142.         token  may represent more than one logical entity.  This section
  1143.         discusses the  way  in  which  grammars  built  by  LEX  resolve
  1144.         ambiguous  input,  as  well  as  a way for the grammar to assign
  1145.         unique meaning to a token by looking ahead in the input stream.
  1146.  
  1147.  
  1148.  
  1149.         6.1  Resolving Ambiguities
  1150.  
  1151.         A LEX program may be ambiguous, in the sense that  a  particular
  1152.         input  string  or  strings  might  be  matched  by  the  regular
  1153.         expression of more than one translation.  Consider,
  1154.  
  1155.                 [a-z] { putchar(*token(NULL)); }
  1156.                 aaa*  { printf("abc"); }
  1157.  
  1158.         in which the string 'aa' is matched by both regular  expressions
  1159.         (twice  by the first, and once by the second).  Also, the string
  1160.         'aaaaaa' may be matched in many  different  ways.   LEX  has  to
  1161.         decide    somehow    which    actions   should   be   performed.
  1162.         (Alternatively, it could produce a diagnostic, and give up.   As
  1163.         it happens, LEX never does this.)
  1164.  
  1165.         Consider a second example,
  1166.  
  1167.                 letter = [a-z];
  1168.                 %%
  1169.                 A(letter)*      { return(1); }
  1170.                 AB(letter)*     { return(2); }
  1171.  
  1172.         which attempts to distinguish sequences of  letters  that  begin
  1173.         with 'a' from similar sequences that begin with 'ab'.  These two
  1174.         examples illustrate two different kinds of  ambiguity,  and  the
  1175.         following indicates how LEX resolves these.
  1176.  
  1177.         In the first example, it seems likely that  the  intent  was  to
  1178.         have both 'aa' and 'aaaaaa' perform the second action, while all
  1179.         single letters 'a' cause the first action to be performed.   LEX
  1180.         does  this  by  ensuring  that  the longest possible part of the
  1181.         input stream will be used to determine the match.  Thus,
  1182.  
  1183.                 <       { return(LESS); }
  1184.                 <=      { return(LESSEQ); }
  1185.  
  1186.         or
  1187.  
  1188.                 digit(digit)*           { return(NUMBER); }
  1189.                 letter(letter|digit)*   { return(NAME); }
  1190.  
  1191.         would work as one might expect.
  1192.  
  1193.         In the second example, the longest-string need not work.  On the
  1194.         string  "abb9",  either  action could apply, and so another rule
  1195.         must be followed.  This states that if, after the longest-string
  1196.         rule  has  been  applied,  there  remains an ambiguity, then the
  1197.         action which appears first in the LEX  program  file  is  to  be
  1198.         performed.   As the second example is written, the second action
  1199.         will never be performed.  It would have been written as:
  1200.  
  1201.                 letter = [a-z];
  1202.                 %%
  1203.                 AB(letter)*     { return(1); }
  1204.                 A(letter)*      { return(2); }
  1205.  
  1206.         The two rules together completely determine a string.
  1207.  
  1208.         At present, LEX produces  no  diagnostic  in  either  case;   it
  1209.         merely  applies  the  rules  and  proceeds.   In  the case where
  1210.         priority is given to the first-appearing rule,  it  might  be  a
  1211.         good idea to produce a diagnostic.
  1212.  
  1213.  
  1214.  
  1215.         6.2  Look-ahead
  1216.  
  1217.         Some facility for looking ahead in the input stream is sometimes
  1218.         required.   (This  facility  might also be regarded as a way for
  1219.         the  programmer  to  more  closely   control   LEX's   ambiguity
  1220.         resolution  process.)  For example, in C, a name followed by "("
  1221.         is to be contextually declared as an external function if it  is
  1222.         otherwise undefined.
  1223.  
  1224.         In Pascal, look-ahead is required to determine that
  1225.  
  1226.                 123..1234
  1227.  
  1228.         is an  integer  123,  followed  by  the  subrange  symbol  "..",
  1229.         followed  by  the  integer 1234, and not simply two real numbers
  1230.         run together.
  1231.  
  1232.         In both of these cases, the desire is to look ahead in the input
  1233.         stream  far  enough  to  be able to make a decision, but without
  1234.         losing tokens in the process.
  1235.  
  1236.         A special  form  of  regular  expression  is  used  to  indicate
  1237.         look-ahead:
  1238.  
  1239.                 re1 '/' re2     '{' action '}'
  1240.  
  1241.         where 're1' and 're2' are regular  expressions.   The  slash  is
  1242.         treated  as  concatenation for the purposes of matching incoming
  1243.         characters;  thus both 're1' and 're2' must match adjacently for
  1244.         the  action  to  be performed.  'Re1' indicates that part of the
  1245.         input string which is the token  to  be  returned,  while  're2'
  1246.         indicates  the context.  The characters matched by 're2' will be
  1247.         re-read at the next call to yylex(), and broken into tokens.
  1248.  
  1249.         Note that you cannot write:
  1250.  
  1251.                 name = re1 / re2;
  1252.  
  1253.         The look-ahead operator must be part of the  rule.   It  is  not
  1254.         valid in definitions.
  1255.  
  1256.         In the first example, the look-ahead operator would be used as:
  1257.  
  1258.                 name / "(" {
  1259.                                 if (name undefined)
  1260.                                         declare name a global function;
  1261.                         }
  1262.                 name    {       /* usual processing for identifiers */
  1263.                         }
  1264.  
  1265.         In the second example, the range construction would be parsed as
  1266.         follows:
  1267.  
  1268.                 digit   = [0-9];
  1269.                 int     = digit(digit)*;
  1270.                 %%
  1271.                 int / ".." int  { /* Start of a range */
  1272.                 ".." int        { /* End of a range   */
  1273.  
  1274.  
  1275.         Note that right-context is  not  sufficient  to  handle  certain
  1276.         types of ambiguity, as is found in several places in the Fortran
  1277.         language.  For example,
  1278.  
  1279.                 do i = 1        Is an assignment statement
  1280.                 do i = 1, 4     Is a DO statement
  1281.  
  1282.         It is not sufficient to use right-context scanning to  look  for
  1283.         the   comma,   as   it   may   occur   within   a  parenthesized
  1284.         sub-expression:
  1285.  
  1286.                 do i = j(k,l)   Is an assignment statement
  1287.  
  1288.         In Fortran, similar problems exist for IF and FORMAT statements,
  1289.         as  well  as counted (Hollerith) string constants.  All of these
  1290.         require a more  powerful  grammar  than  is  possible  with  LEX
  1291.         regular-expressions.
  1292.  
  1293.  
  1294.  
  1295.         7.0  Multiple Scanning Tables; Processor Switching
  1296.  
  1297.         Even a fairly simple syntax may be difficult, or impossible,  to
  1298.         describe  and  process  with  a  single set of translations.  An
  1299.         example of this may be found in C, where strings, which are part
  1300.         of  the language, have quite a different structure, and in order
  1301.         to process them, either a function must be  called  which  reads
  1302.         and parses the input stream for itself, or some mechanism within
  1303.         LEX must be invoked to  cause  a  (usually  massive)  change  of
  1304.         state.
  1305.  
  1306.         LEX does provide such a facility, which is known, after AED,  as
  1307.         'processor  switching'.   Yylex()  locates  its tables through a
  1308.         pointer;  if one simply changes the pointer to point  at  a  new
  1309.         set  of  tables,  one  will have effected the required change of
  1310.         state.  The LEX library function lexswitch(), which is described
  1311.         elsewhere  in  this guide, arranges to do this;  it also returns
  1312.         the old value of the pointer so that it may  be  restored  by  a
  1313.         later  call  to  Lexswitch.   Thus, scanning environments may be
  1314.         stacked, or not, as the user requires.
  1315.  
  1316.  
  1317.  
  1318.         7.1  Creation of a Processor
  1319.  
  1320.         It should be clear that if all the tables produced by LEX from a
  1321.         user's translation file have the same name, someone (the loader)
  1322.         is bound to object.  Some method must be provided to change  the
  1323.         name of the table.
  1324.  
  1325.         This is done by an option flag to the LEX command:
  1326.  
  1327.                 -t name
  1328.  
  1329.         will cause the scanning table to be declared as
  1330.  
  1331.                 struct lextab name;
  1332.  
  1333.         so that it may be passed to LEXswitch:
  1334.  
  1335.                 lexswitch(&name);
  1336.  
  1337.         LEX also writes the program file to  the  file  "name.c"  rather
  1338.         than to "lextab.c."
  1339.  
  1340.  
  1341.                                       NOTE
  1342.  
  1343.             If you use the "easy"  command  line  ("-e  name")  when
  1344.             running  LEX,  the  output  file  and  table  names will
  1345.             correspond nicely.  Re-read the section on operating LEX
  1346.             for more details.
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.         8.0  Conclusion
  1353.  
  1354.         LEX seems to handle most lexical analysis tasks easily.  Indeed,
  1355.         LEX   may  be  more  generally  used  to  write  commands  of  a
  1356.         text-processing nature;  an example of such usage may  be  found
  1357.         in  an  appendix.  LEX programs are far easier to write than the
  1358.         equivalent  C  programs,  and  generally  consume   less   space
  1359.         (although  there  is  an  initial  overhead for the more general
  1360.         table-interpreter  program).   The  encoding  suggested  in  [4]
  1361.         achieves   a  reasonable  compromise  between  table  size,  and
  1362.         scanning speed.  Certainly lexical analysers  are  less  tedious
  1363.         and time-consuming to write.
  1364.  
  1365.         It is expected that most change in the future  will  be  through
  1366.         additions  to  the  LEX  library.   The  LEX language may change
  1367.         slightly to accomodate common kinds  of  processing  (eg,  break
  1368.         characters),  or  to  extend  its range of application.  Neither
  1369.         kind of change should affect existing LEX programs.
  1370.  
  1371.         LEX produces tables and programs for the C language.  The tables
  1372.         are  in a very simple (and stylised) format, and when LEX copies
  1373.         the action routines or the program section, the  code  might  as
  1374.         well  be Fortran for all it cares.  One could write Unix filters
  1375.         to  translate  the  very  simple  C  format  tables  into  other
  1376.         languages,  allowing  LEX  to  be  used  with a larger number of
  1377.         languages, with little extra development  cost.   This  seems  a
  1378.         likely future addition.
  1379.  
  1380.         Because of the look-ahead necessary to  implement  the  "longest
  1381.         string  match"  rule, LEX is unsuitable for interactive programs
  1382.         whose overall structure is:
  1383.  
  1384.                 for (;;) {
  1385.                         prompt_user();
  1386.                         get_input();
  1387.                         process();
  1388.                         print_output();
  1389.                 }
  1390.  
  1391.         If these are rewritten as LEX-generated grammars, the user  will
  1392.         be  confused  by the fact the second input datum must be entered
  1393.         before the first is processed.  It is  possible  to  solve  this
  1394.         dilemna   by   rewriting   function   lexgetc()   to  return  an
  1395.         "end-of-line" character until processing is  complete  for  that
  1396.         line.  An example is shown in the Appendix.
  1397.  
  1398.  
  1399.  
  1400.         9.0  Acknowledgements
  1401.  
  1402.         LEX  is  based  on  a  processor  of  the  same  name  at   Bell
  1403.         Laboratories,   which  also  runs  under  Unix  [3],  and,  more
  1404.         distantly, on AED-0 [1].  This version of LEX was based  on  the
  1405.         description  and suggestions of [4], although the implementation
  1406.         differs significantly in a number of ways.
  1407.  
  1408.  
  1409.  
  1410.         10.0  References
  1411.  
  1412.              1. Johnson,  W.L.,  et.   al.,  "Automatic  generation   of
  1413.                 efficient   lexical   analysers   using   finite   state
  1414.                 techniques", CACM Vol.  11, No.  12, pp.  805-813, 1968.
  1415.  
  1416.              2. Johnson, S.C., "Yacc -- Yet Another  Compiler-Compiler",
  1417.                 CSTR-32,  Bell  Telephone Laboratories, Murray Hill, New
  1418.                 Jersey, 1974.
  1419.  
  1420.              3. Lesk,  M.E.,  "Lex  -  a  lexical  analyser  generator",
  1421.                 CSTR-39,  Bell  Telephone Laboratories, Murray Hill, New
  1422.                 Jersey, 1975.
  1423.  
  1424.              4. Aho, A.V., Ullman, J.D., Principles of Compiler  Design,
  1425.                 Addison-Wesley, Don Mills, Ontario, 1977.
  1426.  
  1427.  
  1428.                                    APPENDIX A
  1429.  
  1430.                                LEX SOURCE GRAMMAR
  1431.  
  1432.  
  1433.  
  1434.         The following is a  grammar  of  LEX  programs  which  generally
  1435.         follows  Bacus-Naur  conventions.  In the rules, "||" stands for
  1436.         alternation (choose one  or  the  other).   Other  graphic  text
  1437.         stands  for  itself.   Several  grammar  elements  have  special
  1438.         meaning:
  1439.  
  1440.                 <anything>      Any text  not  including  the  following
  1441.                                 grammar  element  (either  a  literal or
  1442.                                 end-of-file).
  1443.  
  1444.                 <nothing>       Nothing  --  used  for   optional   rule
  1445.                                 elements.
  1446.  
  1447.                 <name>          A variable name.
  1448.  
  1449.                 <char_class>    A character class specifier.
  1450.  
  1451.                 <string>        A string (text inclosed in '"').
  1452.  
  1453.                 <EOF>           The end of the input file.
  1454.  
  1455.         This grammar was  abstracted  from  the  Yacc  grammar  used  to
  1456.         describe LEX.
  1457.  
  1458.                 program :==             aux_section trans_section
  1459.  
  1460.                 aux_section ::=         auxiliaries %%
  1461.                                 ||      %%
  1462.  
  1463.                 auxiliaries ::=         auxiliaries aux_def
  1464.                                 ||      aux_def
  1465.  
  1466.                 aux_def ::=             name_def = reg_exp ;
  1467.                                 ||      %{ <anything> %}
  1468.  
  1469.                 name_def ::=            <name>
  1470.  
  1471.                 reg_exp ::=             <char_class>
  1472.                                 ||      <string>
  1473.                                 ||      <name>
  1474.                                 ||      reg_exp *
  1475.                                 ||      reg_exp | reg_exp
  1476.                                 ||      reg_exp  reg_exp
  1477.                                 ||      ( reg_exp )
  1478.  
  1479.                 trans_section ::=       translations
  1480.                                 ||      <nothing>
  1481.  
  1482.                 translations ::=        translations translation
  1483.                                 ||      translation
  1484.  
  1485.                 translation ::=         pattern action
  1486.                                 ||      %{ <anything> %}
  1487.                                 ||      %% <anything> <EOF>
  1488.  
  1489.                 pattern ::=             reg_exp / reg_exp
  1490.                                 ||      reg_exp
  1491.  
  1492.  
  1493.  
  1494.                                    APPENDIX B
  1495.  
  1496.                               SOME SMALL EXAMPLES
  1497.  
  1498.  
  1499.         The following example illustrates  the  use  of  the  look-ahead
  1500.         operator, and various other of the nuances of using LEX.
  1501.  
  1502.  
  1503.  
  1504.         B.1  A Complete Command
  1505.  
  1506.         The C programming language has had two different ways of writing
  1507.         its  assignment  operators.   The original method was to write a
  1508.         binary operator immediately following  the  ordinary  assignment
  1509.         operator, forming a compound operator.  Thus 'a =+ b' caused the
  1510.         value of 'a+b' to be assigned to 'a'.  Similarly,
  1511.  
  1512.                 =- =/ =% =* =<< =>> =| =& =^
  1513.  
  1514.         were written  for  the  assignment  operators  corresponding  to
  1515.         subtraction,  division,  modulus,  multiplication,  left  shift,
  1516.         right shift, logical OR, logical AND, and exclusive OR.  In  the
  1517.         current  version of the language, the binary operator is written
  1518.         to the left of the  assignment  operator,  to  remove  potential
  1519.         ambiguity.
  1520.  
  1521.         The LEX program "ctoc"  is  a  filter  which  converts  programs
  1522.         written  in  the  older style into programs written in the newer
  1523.         style.   It  uses  the  look-ahead  operator,  and  the  various
  1524.         dis-ambiguating rules to ensure that sequences like
  1525.  
  1526.                 a==-1           a=++b
  1527.  
  1528.         remain unchanged.
  1529.  
  1530.         /*
  1531.          * ctoc.lxi  --  Convert old C operators to new C form
  1532.          *
  1533.          * Adapted from example in C. Forsythe's LEX manual.
  1534.          *
  1535.          * NOTE:
  1536.          *      Forsythe's program put an entire comment into the token
  1537.          *      buffer. Either define a huge token buffer for my typical
  1538.          *      monster comments, or filter text within comments as if
  1539.          *      it were real C code. This is what I did. So =+ inside
  1540.          *      a comment will get changed to +=, etc.  Note tnat you
  1541.          *      may use the commen() function in LEXLIB if you want the
  1542.          *      comments eaten. I wanted 'em in the output.
  1543.          * by
  1544.          *      Bob Denny
  1545.          *      31-Feb-81
  1546.          */
  1547.         %{
  1548.         char tbuf[80];          /* Token buffer */
  1549.         main()
  1550.           {
  1551.           while (yylex())
  1552.             ;
  1553.           }
  1554.         %}
  1555.         any             = [\0-\177];
  1556.         nesc            = [^\\];
  1557.         nescquote       = [^\\"];
  1558.         nescapost       = [^\\'];
  1559.         schar           = "\\" any | nescquote;
  1560.         cchar           = "\\" any | nescapost;
  1561.         string          = '"' schar* '"';
  1562.         charcon         = "'" cchar* "'";
  1563.         %%
  1564.         "=" ( << | >> | "*" | + | - | "/" | "%" | "&" | "|" | "^" )
  1565.                         {
  1566.                         gettoken(tbuf, sizeof tbuf);
  1567.                         printf("%s=",tbuf+1);
  1568.                         }
  1569.         /*
  1570.          * The following will overflow the token buffer on any but a
  1571.          * small comment:
  1572.          */
  1573.         /*********
  1574.         "/*" ([^*] | "*"[^/])* "*/"
  1575.                 {
  1576.                         lexecho(stdout);
  1577.                 }
  1578.         **********/
  1579.         [<=>!]"=" | "="[<>]
  1580.                         {
  1581.                         lexecho(stdout);
  1582.                         }
  1583.         "=" / ( ++ | -- )
  1584.                         {
  1585.                         lexecho(stdout);
  1586.                         }
  1587.         charcon
  1588.                         {
  1589.                         lexecho(stdout);
  1590.                         }
  1591.         string
  1592.                         {
  1593.                         lexecho(stdout);
  1594.                         }
  1595.         [\0-\377]
  1596.                         {
  1597.                         lexecho(stdout);
  1598.                         }
  1599.  
  1600.  
  1601.         Assuming the Decus compiler running on RSTS/E in RT11 mode,  the
  1602.         above program would be built and executed as follows:
  1603.  
  1604.                 mcr     lex -i ctoc.lxi -o ctoc.c
  1605.                 cc      ctoc/v
  1606.                 as      ctoc/d
  1607.                 link    ctoc=ctoc,c:lexlib,c:suport,c:clib/b:2000
  1608.                 mcr ctoc <old.c >new.c
  1609.  
  1610.  
  1611.         B.2  Interactive Lexical Analysis
  1612.  
  1613.         The following program reads words from  the  terminal,  counting
  1614.         each  as they are entered.  The interaction with the operator is
  1615.         "natural" in the sense that processing for one line is  complete
  1616.         before  the  next  line is input.  To implement this program, it
  1617.         was necessary to include a special version  of  lexgetc()  which
  1618.         returns   <NULL>   if  the  current  line  has  been  completely
  1619.         transmitted to the parser.  Because the parser must  still  have
  1620.         some  look-ahead context, it will return the "end-of-line" token
  1621.         twice at  the  beginning  of  processing.   This  required  some
  1622.         additional tests in the main program.
  1623.  
  1624.         /*
  1625.          * Count words -- interactively
  1626.          */
  1627.         white   = [\n\t ];      /* End of a word        */
  1628.         eol     = [\0];         /* End of input line    */
  1629.         any     = [!-~];        /* All printing char's  */
  1630.         illegal = [\0-\377];    /* Skip over junk       */
  1631.         %{
  1632.         char            line[133];
  1633.         char            *linep          = &line;
  1634.         int             iseof           = 0;
  1635.         int             wordct          = 0;
  1636.         #define T_EOL   1
  1637.         main()
  1638.         {
  1639.                 register int    i;
  1640.                 while ((i = yylex()) != 0) {
  1641.                         /*
  1642.                          * If the "end-of-line"  token  is
  1643.                          * returned  AND  we're  really at
  1644.                          * the end of  a  line,  read  the
  1645.                          * next line.  Note that T_EOL is
  1646.                          * returned twice when the program
  1647.                          * starts because of the nature of
  1648.                          * the look-ahead algorithms.
  1649.                          */
  1650.                         if (i == T_EOL && !is_eof
  1651.                                         && *linep == 0) {
  1652.                                 printf("* ");
  1653.                                 fflush(stdout);
  1654.                                 getline();
  1655.                         }
  1656.                 }
  1657.                 printf("%d words\n", wordct);
  1658.         }
  1659.         %}
  1660.         %%
  1661.         any(any)*       {
  1662.                                 /*
  1663.                                  * Write each  word  on  a
  1664.                                  * seperate output line.
  1665.                                  */
  1666.                                 lexecho(stdout);
  1667.                                 printf("\n");
  1668.                                 wordct++;
  1669.                                 return(LEXSKIP);
  1670.                         }
  1671.         eol             {
  1672.                                 return(T_EOL);
  1673.                         }
  1674.         white(white)*   {
  1675.                                 return(LEXSKIP);
  1676.                         }
  1677.         %%
  1678.         getline()
  1679.         /*
  1680.          * Read a line for lexgetc()
  1681.          */
  1682.         {
  1683.                 is_eof = (fgets(line, sizeof line, stdin)
  1684.                                 == NULL);
  1685.                 linep = &line;
  1686.         }
  1687.         lexgetc()
  1688.         /*
  1689.          * Homemade  lexgetc  --  return zero while at the
  1690.          * end of an input line or EOF at end of file.  If
  1691.          * more on this line, return the next byte.
  1692.          */
  1693.         {
  1694.                 return(   (is_eof) ?            EOF
  1695.                         : (*linep == 0) ?       0
  1696.                         :                       *linep++);
  1697.         }
  1698.